/* 
 * File:   CalculatorMainWindow.h
 * Author: Gab'z
 *
 * Created on 6 juin 2012, 16:35
 */

#ifndef _CALCULATORMAINWINDOW_H
#define	_CALCULATORMAINWINDOW_H

#include <QMainWindow>
#include <sstream>
#include "ui_CalculatorMainWindow.h"
#include <string>
#include "../controler/Engine.h"
#include "log/LogSystem.h"
#include "StackTabList.h"
#include "../exception/ViewException.h"

namespace Ui {
    class CalculatorMainWindow;
}

namespace calculator {
    class Parameters;

    /**
     * La fenêtre principale de l'application.
     * Obligatoirement ssociée à un moteur pour accéder au Context.
     */
    class CalculatorMainWindow : public QMainWindow {
        Q_OBJECT

    public:

        /**
         * Constructeur de l'interface principale.
         * @param parent laissé vide, aucun parent.
         */
        CalculatorMainWindow(QWidget *parent = 0);

        /**
         * Destructeur de l'interface
         */
        virtual ~CalculatorMainWindow();

        /**
         * Getter vers le moteur utilisé par l'application.
         * @return le moteur utilisé.
         */
        const Engine * const getEngine() const {
            return _engine;
        }

        /**
         * Setter pour le moteur de l'interface.
         * Passage obligatoire car impossibilité de passer des paramètres
         *  supplémentaires dans le constructeur de l'interface.
         * (Qt interdit la copie d'un QMainWindows).
         * @param engine le moteru à utiliser.
         */
        void setEngine(const Engine* engine) {
            _engine = engine;
        }

        //        /**
        //         * Getter pour 
        //         * @return 
        //         */
        //        std::string getInputString() const {
        //            return ui->inputLine->text().toStdString();
        //        }

        /**
         * Initialise les composants de la vue avec les paramètres.
         */
        void init() throw (ViewException);

        /**
         * Met à jour les différents composants de la vue.
         */
        void updateView();

        /**
         * Désactive la connexion entre le signal émis par un changement.
         *  de StackTabWidget pour éviter les problèmes lors de la suppression .
         * de ces derniers
         */
        void prepareForShutdown();

    public slots:

        void sRun();
        void sUndo();
        void sRedo();
        void sEval();

        void sShowKeyboard();
        void sHideKeyboard();
        void sShowParametersWidget();

        void sHelp();
        void sAbout();
        void sSave();
        void sInputLineEdited();

        void sNumeralButton(const std::string str);
        void sTextButton(const std::string str);
        
        // <editor-fold defaultstate="collapsed" desc="SLOTS CLAVIER">
        void s0();
        void s1();
        void s2();
        void s3();
        void s4();
        void s5();
        void s6();
        void s7();
        void s8();
        void s9();
        void sAdd();
        void sSub();
        void sMul();
        void sDiv();
        void sDot();
        void sDollar();
        void sSwap();
        void sDup();
        void sDrop();
        void sClear();
        void sMod();
        void sLog();
        void sFact();
        void sCube();
        void sPow();
        void sSqrt();
        void sSqr();
        void sLn();
        void sSign();
        void sSin();
        void sCos();
        void sTan();
        void sSinh();
        void sCosh();
        void sTanh();
        void sInv();
        void sExpression();
        void sSum();
        void sMean();
        void sUserCommand();
        void sSpace();
        void sBackSpace();
        void sRaz();
        // </editor-fold>

        // <editor-fold defaultstate="collapsed" desc="SLOTS MODE">
        // slots mode
        void sIntegerMode();
        void sRationnalMode();
        void sRealMode();
        void sComplexMode();

        void sDegree();
        void sRadian(); // </editor-fold>

        // <editor-fold defaultstate="collapsed" desc="SLOTS STACKLIST">
        void sNewStack();
        void sDupStack();
        void sRemStack();
        void sSwitchStack(int index); // </editor-fold>

    private:

        /**
         * Pointeur vers le moteur de l'application.
         */
        const Engine* _engine;

        /**
         * La fenêtre elle-même (généré par Qt).
         */
        Ui::CalculatorMainWindow *ui;

        /**
         * L'objet conteneur de StackTabWidget
         */
        StackTabList* _tabList;

        /**
         * booléen utilisé par l'interface pour savoir si l'on remplace.
         * le contenu de la ligne de saisie.
         */
        bool hasJustRun;

        /**
         * Déporte les connections effectuées dans le constructeur.
         * Uniquement pour alléger la lecture du programme.
         */
        void makeConnections();

        /**
         * Point de sortie de l'interface, appelle la méthode run du moteur
         * @param input
         */
        void run(QString input);


        /**
         * Récupère les paramètres du Context et les applique à la vue
         */
        void applyViewParameters();

        /**
         * Initialise l'affichage des StackTabWidget
         */
        void initStackTabContainer();


        /**
         * Met à jour les boutons annuler/refaire
         */
        void updateUndoRedoItemMenu();
        
        /**
         * met à jour les boutons Piles du menu
         */
        void updateStackItemMenu();
        
        /**
         * Actualise le nom des StackTabWidget après ajout/suppression/duplication
         */
        void updateTabName();

        static Logger* log;
    };
}

#endif	/* _CALCULATORMAINWINDOW_H */
